package persistencia;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import outros.Conexao;
import transporte.TOSetor;

public class DAOSetor {
    private Conexao conexao = new Conexao();
    private Connection con = null;

    public boolean abrirConexao() {
        UIManager.put("OptionPane.yesButtonText", "Sim");
        UIManager.put("OptionPane.noButtonText", "Não");
        UIManager.put("OptionPane.cancelButtonText", "Cancelar");
        try {
            conexao.abrirConexao();
            con = conexao.getConexao();
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao tentar conectar ao banco de dados.");
            return false;
        }
    }

    public String criar(TOSetor setor) {
        PreparedStatement ps = null;
        String sql = "INSERT INTO patri_setor VALUES (?,?,?,?)";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            int id = getProximo();
            if (id!=0) {
                ps.setInt(1, id);
                ps.setString(2, setor.getNome());
                ps.setString(3, setor.getChefe());
                ps.setString(4, setor.getRamal());
                ps.execute();
                con.commit();
                conexao.fecharConexao();
                return "";
            } else {
                conexao.fecharConexao();
                JOptionPane.showMessageDialog(null, "Erro ao tentar atribuir novo ID.");
                return "erro";
            }
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar inserir dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public TOSetor selecionarRegistro(int id) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_setor WHERE numero="+id;
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            TOSetor to;
            if (rs.first()) {
                to = new TOSetor();
                to.setNumero(rs.getInt("numero"));
                to.setNome(rs.getString("nome"));
                to.setChefe(rs.getString("chefe"));
                to.setRamal(rs.getString("ramal"));
                return to;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public ArrayList<TOSetor> selecionar(String busca) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        if (busca.length()==0) {
            sql = "SELECT * FROM patri_setor ORDER BY nome ASC";
        } else {
            sql = "SELECT * FROM patri_setor WHERE sem_acento(nome) ILIKE '%"+busca+"%' ORDER BY nome ASC";
        }
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            ArrayList<TOSetor> al = new ArrayList();
            TOSetor to = null;
            while (rs.next()) {
                to = new TOSetor();
                to.setNumero(rs.getInt("numero"));
                to.setNome(rs.getString("nome"));
                to.setChefe(rs.getString("chefe"));
                to.setRamal(rs.getString("ramal"));
                al.add(to);
            }
            return al;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public String excluir(int numero) {
        PreparedStatement ps = null;
        String sql = "DELETE FROM patri_setor WHERE numero=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setInt(1, numero);
            ps.execute();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar excluír dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public String alterar(TOSetor setor) {
        PreparedStatement ps = null;
        String sql = "UPDATE patri_setor SET nome=?, chefe=?, ramal=? WHERE numero=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setString(1, setor.getNome());
            ps.setString(2, setor.getChefe());
            ps.setString(3, setor.getRamal());
            ps.setInt(4, setor.getNumero());
            ps.execute();
            con.commit();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar alterar dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public String getAtributo(int id, String atributo) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT "+atributo+" FROM patri_setor WHERE numero="+id;
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            if (rs.first()) {
                return rs.getString(atributo);
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar chefe. Detalhes: "+e.toString());
            return null;
        }
    }


    private int getProximo(){
        String sql = "SELECT MAX(numero) FROM patri_setor";
        try {
            Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rs = st.executeQuery(sql);
            if (rs.first()){
                return rs.getInt(1)+1;
            } else {
                return 0;
            }
        } catch (Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            return 0;
        }
    }
}
